/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package logica;

/**
 *
 * @author Elias Mendoza
 * Modulo de procesamiento de los datos recividos del puerto serial
 */
import controlador.ContenedorComponente;
import java.util.*;
import javax.comm.*;
import javax.swing.JTextArea;

public class ProcesaCadena {

  public GrupoSensores objgrupo;
  public String dato;
  public boolean correcto = false;
  public String caracteres_validos = "ABCDEFGHI1234567890.-Sp*";
  public String grupos_sen = "ABCD";
  public String valores_num = "0123456789.";
  public int contax = 0;
  //Declaracion y creacion de ArrayList que guardara los datos leidos del sensor
  //Vaciandolos en un objeto GrupoSensores
  public ArrayList<GrupoSensores> sensores = new ArrayList<GrupoSensores>();
  public int grupo;//variable que almacena el ID del grupo de sensor
  //valores de humedad de los cuatro sensores que conforman un grupo
  String vsensor1 = "";
  String vsensor2 = "";
  String vsensor3 = "";
  String vsensor4 = "";
  String val_ref = "";//valor  de referecia de humedad
  String val_sta = "";//valor  del estado de la valvula
  String val_dn = "";//valor de dia o noche
  ContenedorComponente cc;

  public ProcesaCadena(CommPortIdentifier idPuerto, ContenedorComponente cc) {
    this.cc = cc;
    new HiloRecibeDato(idPuerto, this);
    cc.getDatosRecibidos().setText(dato);
  }

  public void recibeLectura(String cad) {
    int posicion = 0;
    posicion = caracteres_validos.indexOf(cad);
    if (posicion > -1) {
      if (cad.equals("-")) {
        contax++;
      }
      System.out.println("El caracter es valido: " + cad);
      cc.getDatosRecibidos().setText(cc.getDatosRecibidos().getText()+cad);
      correcto = true;
    } else {
      System.out.println("El caracter no fue valido: " + cad);
      cc.getDatosRecibidos().setText(cc.getDatosRecibidos().getText()+cad);
      correcto = false;
    }
    //Determina que a que grupo de sensores pertenece la lectura
    if (grupos_sen.indexOf(cad) > -1 && correcto == true) {
      objgrupo = new GrupoSensores();
      objgrupo.setGrupo(cad);
      grupo = grupos_sen.indexOf(cad);
      System.out.println("Grupo: " + grupo + "--" + objgrupo.getGrupo());
    }
    //comenzar a concatenar los valores de humedad cada sensor por grupos de sendores
    if (valores_num.indexOf(cad) > -1 && correcto == true) {
      switch (contax) {
        case 1:
          vsensor1 += cad;
          break;
        case 2:
          vsensor2 += cad;
          break;
        case 3:
          vsensor3 += cad;
          break;
        case 4:
          vsensor4 += cad;
          break;
        case 5:
          val_ref += cad;
          break;
        case 6:
          val_sta += cad;
          break;
        case 7:
          val_dn += cad;
          break;
      }
    }
    if (cad.equals("-") && contax == 8 && correcto == true) {
      llenaVector();
      //Vaciando los valores actuales de las variables para recibir los nuevos
      contax = 0;
      vsensor1 = "";
      vsensor2 = "";
      vsensor3 = "";
      vsensor4 = "";
      val_ref = "";
      val_sta = "";
      val_dn = "";
      if (!terminado()) {
        System.out.println("NO se han Terinado de llenar los Grupos");
      }
    }
  }

  public void llenaVector() {//Asigna los valors a GrupoSensores
    objgrupo.setVsensor1(vsensor1);
    objgrupo.setVsensor2(vsensor2);
    objgrupo.setVsensor3(vsensor3);
    objgrupo.setVsensor4(vsensor4);
    objgrupo.setVal_ref(val_ref);
    objgrupo.setVal_sta(val_sta);
    objgrupo.setVal_dn(val_dn);
    sensores.add(objgrupo);
    System.out.println("El Gruopo: " + objgrupo.getGrupo() + " se ha llenado");
  }

  public boolean terminado() {//metodo que sirve para comprobar si se han insertado los 4 objetos en el ArrayList
    boolean ter = false;
    if (!sensores.isEmpty()) {
      if (sensores.size() > 3) {
        System.out.println("Se han llenado los " + sensores.size() + " grupos");
        imprimeDatos();
        OperacionBaseDatos op = new OperacionBaseDatos(cc);
        op.insertarRegistroSensores(sensores);
        cc.getDatosRecibidos().setText("");
        sensores.clear();
        ter = true;
      }
    } else {
      ter = false;
    }
    return ter;
  }

  public void imprimeDatos() {
    for (GrupoSensores tmp : sensores) {
      System.out.print(tmp.getGrupo() + ","
              + tmp.getVsensor1() + ","
              + tmp.getVsensor2() + ","
              + tmp.getVsensor3() + ","
              + tmp.getVsensor4() + ","
              + tmp.getVal_ref() + ","
              + tmp.getVal_sta() + ","
              + tmp.getVal_dn() + "\n");
    }
  }
}
